CVE-2019-0230(S2-059 Apache Struts2 远程代码执行漏洞)分析
Struts2 在处理 OGNL 语言时,会做 OGNL 语法双重解析,即在 OGNL 表达式中再次传入 OGNL 表达式时,同样会再做一次解析。
影响范围:Apache Struts 2.0.0 ~ 2.5.20,我未做那么多版本的测试,以下可以在 2.5.20 中复现。
例如:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>S2-059 test</title> </head> <body> <p> <a href="test_execute.action?id=1">test GET method link</a> </p> <form action="${pageContext.request.contextPath}/test_execute.action" method="post"> <s:a id="%{id}">test_link</s:a> <h1>Value:</h1> <s:textfield name="id" value="%{id}"></s:textfield> <input type="submit" value="poc"> </form> </body> </html>
本身 id 就是一个 OGNL 表达式,如果 id 这个变量能被外部控制,那么再传递一个 OGNL 表达式同样能被解析:
id=vul%25{245%2b5}
漏洞环境请见:https://github.com/1u4nx/Vulnerable_Env_Collect/tree/master/CVE-2019-0230%EF%BC%88S2-059%EF%BC%89